Welcome to pandas!

7.6 分组后的聚合处理

1、常规聚合处理

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")

print (df)

dict={}

for t,d in df.groupby(df.公司):

dict[t]=d.iloc[:,2:].sum()

df1=pd.DataFrame(dict).T.reset_index().rename(columns={ "index" : "公司" })

#.T为列转行;

# reset_index()为加索引名为“index";

# .rename(columns={"index":"公司"});是高尔夫索引名”index“改为”公司“

print (df1)

返回:

公司 业务员 A B C
0 成都分公司 张三 2454 2354 8486
1 成都分公司 李四 7196 7235 3043
2 成都分公司 许麻子 6984 7154 6046
3 上海分公司 郭流子 8294 6364 3607
4 上海分公司 杨老六 1636 1485 7564
5 北京分公司 王麻子 1217 9492 193
6 北京分公司 潘九 2100 4459 2011

公司 A B C
0 上海分公司 9930 7849 11171
1 北京分公司 3317 13951 2204
2 成都分公司 16634 16743 17575

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")

df1=df.groupby( "公司" ).sum().reset_index()

df2=df.groupby( "公司" ).max().reset_index()

print (df1)

print (df2)

返回:

公司 业务员 A B C
0 上海分公司 郭流子杨老六 3776 6914 7322
1 北京分公司 王麻子潘九 10535 8675 12048
2 成都分公司 张三李四许麻子 14613 13235 9686

公司 业务员 A B C
0 上海分公司 郭流子 3134 4399 5773
1 北京分公司 王麻子 5393 6474 7911
2 成都分公司 许麻子 8816 9217 6316

2、agg()函数

直接对分组对象使用聚合函数虽然操作简单,但它对所有列都执行聚合处理,很多时候,用户希望自己定义聚合的列,聚合方式也不需要统一,那么可以使用agg()函数,结构如下:

agg(func,*args,**kwargs)

func :指定聚合方式,可以是函数,字符串函数、列表、字典

*args :要传递给func的位置参数

**kwargs :要传递给func的关键参数

将agg()函数与聚合函数结合,能将分组对象的聚合能力最大化。

1、 所有列执行多种聚合方式-列表形式

对分组对象的所有列执行多种聚合方式

2、 不同列设置不同聚合方式-字典形式

其实在对分组做聚合时,大多数不会对所有列执行同一种聚合方式,更多是指定列做指定的聚合方式。


import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")

df1=df.groupby("公司").agg([ "sum","max"]) #maen会报错

df2=df.groupby("公司").agg(

{ "A" : "sum" ,

"B" : "max" ,

"C" :[ "max","min" ]

}

)

print (df1)

print (df2)

返回:

业务员 A B C
sum max sum max sum max sum max
公司
上海分公司 郭流子杨老六 郭流子 3776 3134 6914 4399 7322 5773
北京分公司 王麻子潘九 王麻子 10535 5393 8675 6474 12048 7911
成都分公司 张三李四许麻子 许麻子 14613 8816 13235 9217 9686 6316

A B C
sum max max min
公司
上海分公司 3776 4399 5773 1549
北京分公司 10535 6474 7911 4137
成都分公司 14613 9217 6316 1415

3、聚合处理

前面学习了agg()函数的func参数中使用列表、字典的聚合方式,但不能修改聚合后的列名,可以设置使命名聚合

命名聚合是在命名时,可能有些字符是无效的,也就是无法命名成功,则可以换一种方式,就是以构建字典并解压缩关键字参数的方式完成。

前学agg()函数与聚合函数是配合使用是内置的,其实也可以自定义。

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")

df1=df.groupby( "公司" ).agg(

A求和=( "A","sum"),

B求最大=( "B", "sum")

).reset_index()

print (df1)

返回:

公司 A求和 B求最大
0 上海分公司 3776 6914
1 北京分公司 10535 8675
2 成都分公司 14613 13235

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx" )

df1=df.groupby("公司").agg(

**{ "2022年A求和" :( "A","sum" ), #加**是以构建字典并解压缩关键字参数的方式完成

"2022年B求最大" :( "B", "sum" )} #以数字开头的索引名需以字典的形式

).reset_index()

print (df1)

返回:

公司 2022年A求和 2022年B求最大
0 上海分公司 3776 6914
1 北京分公司 10535 8675
2 成都分公司 14613 13235

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")

df1=df.groupby("公司").agg(

名单=( "业务员",lambda s:s.str.cat(sep=","))

).reset_index()

print (df1)

返回:

公司 名单
0 上海分公司 郭流子,杨老六
1 北京分公司 王麻子,潘九
2 成都分公司 张三,李四,许麻子

import pandas as pd

df=pd.read_excel(r "D:\Pyobject2023\object\测试\素材\1.7.06 分组后的聚合处理.xlsx")

df1=df.groupby("公司").agg(

名单=( "业务员"lambda s: "," .join(s))

).reset_index()

print (df1)

返回:

公司 名单
0 上海分公司 郭流子,杨老六
1 北京分公司 王麻子,潘九
2 成都分公司 张三,李四,许麻子